import 'package:flutter/foundation.dart';
import 'package:get/get.dart';
import 'storage_service.dart';
import '../values/constants.dart';

/// 应用配置服务 - 业务层服务
/// 
/// 🎯 核心职责：
/// - 管理应用级设置（深色模式、语言、首次运行等）
/// - 提供配置项的读写接口
/// - 维护配置项的响应式状态
/// - 应用版本管理
/// 
/// ⚠️ 重要原则：
/// - 专注于应用配置业务逻辑
/// - 通过 StorageService 进行实际存储操作
/// - 不直接操作 SharedPreferences
class AppConfigService extends GetxService {
  static AppConfigService get to => Get.find<AppConfigService>();
  
  // ==================== 依赖注入 ====================
  StorageService get _storage => Get.find<StorageService>();
  
  // ==================== 响应式状态 ====================
  final _isDarkMode = false.obs;
  final _language = Constants.defaultLanguage.obs;
  final _isFirstRun = true.obs;
  final _appVersion = ''.obs;
  final _isInitialized = false.obs;
  
  // ==================== 同步访问器 ====================
  bool get isDarkMode => _isDarkMode.value;
  String get language => _language.value;
  bool get isFirstRun => _isFirstRun.value;
  String get appVersion => _appVersion.value;
  bool get isInitialized => _isInitialized.value;
  
  // ==================== 响应式访问器 ====================
  RxBool get isDarkModeRx => _isDarkMode;
  RxString get languageRx => _language;
  RxBool get isFirstRunRx => _isFirstRun;
  RxString get appVersionRx => _appVersion;
  RxBool get isInitializedRx => _isInitialized;
  
  // ==================== 生命周期 ====================
  @override
  Future<void> onInit() async {
    super.onInit();
    debugPrint('⚙️ AppConfigService 初始化开始...');
    
    try {
      await _loadConfigurations();
      _isInitialized.value = true;
      
      debugPrint('✅ AppConfigService 初始化完成');
    } catch (e) {
      debugPrint('❌ AppConfigService 初始化失败: $e');
      rethrow;
    }
  }
  
  @override
  void onClose() {
    debugPrint('🧹 AppConfigService 正在清理...');
    super.onClose();
  }
  
  // ==================== 私有方法 ====================
  
  /// 加载所有配置
  Future<void> _loadConfigurations() async {
    try {
      debugPrint('🔄 加载应用配置...');
      
      // 加载深色模式设置
      _isDarkMode.value = _storage.getBool(Constants.storageKeyDarkMode) ?? false;
      
      // 加载语言设置
      _language.value = _storage.getString(Constants.storageKeyLanguage) ?? Constants.defaultLanguage;
      
      // 加载首次运行标志
      _isFirstRun.value = _storage.getBool(Constants.storageKeyFirstRun) ?? true;
      
      // 加载应用版本
      _appVersion.value = _storage.getString(Constants.storageKeyAppVersion) ?? '';
      
      if (kDebugMode) {
        _printConfigurations();
      }
      
      debugPrint('✅ 应用配置加载完成');
    } catch (e) {
      debugPrint('❌ 加载应用配置失败: $e');
      // 使用默认值，不抛出异常
    }
  }
  
  /// 打印当前配置（调试用）
  void _printConfigurations() {
    debugPrint('================= 应用配置 =================');
    debugPrint('深色模式: ${_isDarkMode.value}');
    debugPrint('语言设置: ${_language.value}');
    debugPrint('首次运行: ${_isFirstRun.value}');
    debugPrint('应用版本: ${_appVersion.value}');
    debugPrint('============================================');
  }
  
  // ==================== 深色模式管理 ====================
  
  /// 设置深色模式
  Future<bool> setDarkMode(bool isDark) async {
    try {
      final success = await _storage.setBool(Constants.storageKeyDarkMode, isDark);
      if (success) {
        _isDarkMode.value = isDark;
        debugPrint('🎨 深色模式设置: $isDark');
      }
      return success;
    } catch (e) {
      debugPrint('❌ 设置深色模式失败: $e');
      return false;
    }
  }
  
  /// 切换深色模式
  Future<bool> toggleDarkMode() async {
    return await setDarkMode(!_isDarkMode.value);
  }
  
  // ==================== 语言管理 ====================
  
  /// 设置语言
  Future<bool> setLanguage(String languageCode) async {
    try {
      final success = await _storage.setString(Constants.storageKeyLanguage, languageCode);
      if (success) {
        _language.value = languageCode;
        debugPrint('🌐 语言设置: $languageCode');
      }
      return success;
    } catch (e) {
      debugPrint('❌ 设置语言失败: $e');
      return false;
    }
  }
  
  /// 获取支持的语言列表
  List<String> getSupportedLanguages() {
    // TODO: 从配置文件或常量中获取
    return ['zh_CN', 'en_US'];
  }
  
  // ==================== 首次运行管理 ====================
  
  /// 标记首次运行完成
  Future<bool> markFirstRunComplete() async {
    try {
      final success = await _storage.setBool(Constants.storageKeyFirstRun, false);
      if (success) {
        _isFirstRun.value = false;
        debugPrint('🏁 首次运行标记完成');
      }
      return success;
    } catch (e) {
      debugPrint('❌ 标记首次运行失败: $e');
      return false;
    }
  }
  
  /// 重置首次运行标志（用于测试）
  Future<bool> resetFirstRun() async {
    try {
      final success = await _storage.setBool(Constants.storageKeyFirstRun, true);
      if (success) {
        _isFirstRun.value = true;
        debugPrint('🔄 首次运行标志已重置');
      }
      return success;
    } catch (e) {
      debugPrint('❌ 重置首次运行标志失败: $e');
      return false;
    }
  }
  
  // ==================== 应用版本管理 ====================
  
  /// 保存应用版本
  Future<bool> saveAppVersion(String version) async {
    try {
      final success = await _storage.setString(Constants.storageKeyAppVersion, version);
      if (success) {
        _appVersion.value = version;
        debugPrint('📱 应用版本保存: $version');
      }
      return success;
    } catch (e) {
      debugPrint('❌ 保存应用版本失败: $e');
      return false;
    }
  }
  
  /// 获取保存的应用版本
  String getSavedAppVersion() {
    return _appVersion.value;
  }
  
  /// 检查是否需要更新配置
  /// 
  /// 比较当前版本与保存的版本，判断是否需要迁移配置
  bool needsConfigMigration(String currentVersion) {
    final savedVersion = _appVersion.value;
    if (savedVersion.isEmpty) return true;
    
    // TODO: 实现版本比较逻辑
    return savedVersion != currentVersion;
  }
  
  // ==================== 配置重置 ====================
  
  /// 重置所有配置为默认值
  Future<bool> resetAllConfigurations() async {
    try {
      debugPrint('🔄 重置所有应用配置...');
      
      // 重置深色模式
      await setDarkMode(false);
      
      // 重置语言
      await setLanguage(Constants.defaultLanguage);
      
      // 重置首次运行标志
      await _storage.setBool(Constants.storageKeyFirstRun, true);
      _isFirstRun.value = true;
      
      // 清除应用版本
      await _storage.remove(Constants.storageKeyAppVersion);
      _appVersion.value = '';
      
      debugPrint('✅ 所有应用配置已重置');
      return true;
    } catch (e) {
      debugPrint('❌ 重置应用配置失败: $e');
      return false;
    }
  }
  
  // ==================== 配置导出/导入 ====================
  
  /// 导出所有配置
  Map<String, dynamic> exportConfigurations() {
    return {
      'isDarkMode': _isDarkMode.value,
      'language': _language.value,
      'isFirstRun': _isFirstRun.value,
      'appVersion': _appVersion.value,
      'exportTime': DateTime.now().toIso8601String(),
    };
  }
  
  /// 导入配置
  Future<bool> importConfigurations(Map<String, dynamic> config) async {
    try {
      debugPrint('📥 导入应用配置...');
      
      if (config.containsKey('isDarkMode')) {
        await setDarkMode(config['isDarkMode'] as bool);
      }
      
      if (config.containsKey('language')) {
        await setLanguage(config['language'] as String);
      }
      
      if (config.containsKey('isFirstRun')) {
        await _storage.setBool(Constants.storageKeyFirstRun, config['isFirstRun'] as bool);
        _isFirstRun.value = config['isFirstRun'] as bool;
      }
      
      if (config.containsKey('appVersion')) {
        await saveAppVersion(config['appVersion'] as String);
      }
      
      debugPrint('✅ 应用配置导入成功');
      return true;
    } catch (e) {
      debugPrint('❌ 导入应用配置失败: $e');
      return false;
    }
  }
  
  // ==================== 配置验证 ====================
  
  /// 验证配置完整性
  bool validateConfigurations() {
    try {
      // 验证语言代码
      if (_language.value.isEmpty) {
        debugPrint('⚠️ 语言配置为空');
        return false;
      }
      
      // 验证语言代码格式
      final supportedLanguages = getSupportedLanguages();
      if (!supportedLanguages.contains(_language.value)) {
        debugPrint('⚠️ 不支持的语言代码: ${_language.value}');
        return false;
      }
      
      debugPrint('✅ 配置验证通过');
      return true;
    } catch (e) {
      debugPrint('❌ 配置验证失败: $e');
      return false;
    }
  }
}

